dofile "util.lua"

morph:word({ female = true, 
                    singular = true, 
                    "Лиза", 
                    "Лизу", 
                    "Лизе", 
                    "Лизу", 
                    "Лизой", 
                    "Лизе" })
morph:word({        singular = true, 
                    "прибрежная", 
                    "прибрежную", 
                    "прибрежной", 
                    "прибрежную", 
                    "прибрежной", 
                    "прибрежной" })
morph:word({        singular = true, 
                    "виски", 
                    "виски", 
                    "виски", 
                    "виски", 
                    "виски", 
                    "виски" })
--1. Refresh
Verb { "Refresh", "~осмотреться", "{}" }

--2. Exit
Verb { "Exit", "~выйти|~уйти", "{}" }
parser.events.Exit = function()
  return "И куда же мне уйти?";
end;

--3. Exam
function verb_exam_type(s)
  if s:word(3) == "через" then
    return "ExamWith %2 %4";
  else
    return "Exam %2";
  end
end
function verb_exam_type2(s)
  if s:word(2) == "в" then
    return "ExamWith %5 %3";
  elseif s:word(4) == "через" then
    return "ExamWith %3 %5";
  else
    return "Exam %3";
  end
end
function verb_exam_in1(s)
  if s:word(2) == "в" then
    return aux_with_inv_("вн")(s);
  else
    return verb_with_obj_inv_("вн", nil, "{hero}вн")(s);
  end
end
function verb_exam_in2(s)
  if s:word(2) == "в" then
    return "на";
  else
    return "{}|через";
  end
end
function verb_exam_in3(s)
  if s:word(2) == "в" then
    return verb_with_obj_inv_("вн")(s);
  else
    return aux_with_inv_("вн")(s);
  end
end
Verb { verb_exam_type, "~осмотреть|~изучить|~исследовать|~рассмотреть", verb_with_obj_inv_("вн", nil, "{hero}вн"), "{}|через", aux_with_inv_("вн") }
parser.events.ExamWith = function()
  return "Вряд ли мне для этого требуется подзорная труба.";
end
Verb { verb_exam_type2, "~смотреть|~посмотреть", "в|на", verb_exam_in1, verb_exam_in2, verb_exam_in3 }

--4. Walk
function verb_walk_type(s)
  if s:word(2) == "по" then
    return "WalkOn %3";
  elseif s:word(2) == "к" then
    return "WalkTo %3";
  elseif s:word(2) == "в" then
    return "WalkIn %3";
  else
    return "Walk %3";
  end
end
function form_walk_type(s,v)
  if s:word(2) == "по" then
    return "дт";
  elseif s:word(2) == "к" then
    return "дт";
  else
    return "вн";
  end
end
Verb { verb_walk_type, "~идти", "в|на|по|к", verb_with_obj_(form_walk_type) }
parser.events.Walk = nil;
Verb { "Approach %3", "~подойти", "к", verb_with_obj_("дт") }

--5. Wait
Verb { "Wait", "~ждать|~ожидать", "{}" }
parser.events.Wait = function()
  return "Я немного подождал -- сам не понимая, чего я жду.";
end

--6. Take
Verb { "Take %2", "~взять|~забрать", verb_with_obj_("вн") }

--7. Clean
Verb { "Clean %2 %3", "~протереть|~очистить", verb_with_obj_inv_("вн"), aux_with_obj_inv_("тв") }
parser.events.Clean = function()
  return "У меня сейчас нет желания убираться.";
end

--8. TakeOff
Verb { "TakeOff %2", "~снять", verb_with_obj_inv_("вн") }

--9. Wear
Verb { "Wear %2", "~надеть", verb_with_inv_("вн") }

--10. Open
Verb { "Open %2 %3", "~открыть", verb_with_obj_("вн"), aux_with_inv_("тв", nil, "{}") }

--11. Ascend
function verb_ascend_type(s)
  if s:word(2) == "в" then
    return "GetIn %3";
  else
    return "Ascend %3";
  end
end
Verb { verb_ascend_type, "~подняться", "на|в", verb_with_obj_("вн") }

--12. Descend
function verb_descend_type(s)
  if s:word(2) == "в" then
    return "DescendTo %3";
  elseif s:word(2) == "на" then
    return "DescendOn %3";
  else
    return "Descend %3";
  end
end
function verb_descend(s,v)
  local filter = (s:word(2) == "со");
  local sw = rcall(v.nam,v):startsWith("с");
  return (filter and sw) or (not filter and not sw);
end
function verb_descend_form(s)
  if s:word(2) == "в" then
    return "вн";
  elseif s:word(2) == "на" then
    return "вн";
  else
    return "рд";
  end
end
Verb { verb_descend_type, "~спуститься|~слезть", "с|со|в|на", verb_with_obj_(verb_descend_form) }

--13. Jump
function verb_jump_type(s)
  if s:word(2) == "с" or s:word(2) == "со" then
    return "JumpFrom %3";
  else
    return "Jump %3";
  end
end
function verb_jump_art(s)
  if s:word(1) == "прыгнуть" then
    return "на|с|со";
  elseif s:word(1) == "спрыгнуть" then
    return "с|со";
  else
    return "на";
  end
end
function verb_jump_form(s)
  if s:word(2) == "с" or s:word(2) == "со" then
    return "рд";
  else
    return "вн";
  end
end
Verb { verb_jump_type, "~прыгнуть|~запрыгнуть|~спрыгнуть", verb_jump_art, verb_with_obj_(verb_jump_form) }

--14. Sit
function verb_sit_type(s)
  if s:word(2) == "в" then
    return "SitIn %3";
  elseif s:word(2) == "за" then
    return "SitAt %3";
  else
    return "Sit %3";
  end
end
Verb { verb_sit_type, "~сесть|~присесть", "на|за|в", verb_with_obj_("вн") }

--15. Stand
function verb_stand_type(s)
  if s:word(2) == "из-за" then
    return "StandAtFrom %3";
  elseif s:word(2) == "из" then
    return "StandFrom %3";
  elseif s:word(2) == "на" then
    return "StandOn %3";
  else
    return "Stand %3";
  end
end
function verb_stand(s)
  if s:word(2) == "на" then
    return "вн";
  else
    return "рд";
  end
end
Verb { verb_stand_type, "~встать", "из-за|из|с|на", verb_with_obj_(verb_stand) }

--16. Fire
Verb { "Fire %2 %3", "~зажечь|~поджечь", verb_with_obj_inv_("вн"), aux_with_inv_("тв") }
parser.events.Fire = function(self, s)
  return "Я не собираюсь поджигать " .. s:M("вн") .. ".";
end

--17. FireOff
Verb { "FireOff %2", "~потушить|~тушить", verb_with_obj_inv_("вн") }
parser.events.FireOff = function(self, s)
  return "К счастью, " .. s:M("им") .. " не горит."
end

--18. Pure
Verb { "Pure %2 %4", "~вылить|~налить|~лить", verb_with_obj_inv_("вн"), "на", aux_with_obj_inv_("вн") }

--19. Pick
Verb { "Pick %2", "~поднять|~подобрать", verb_with_obj_("вн") }

--20. Throw
function verb_throw_type(s)
  if s:word(3) == "в" then
    return "ThrowIn %2 %4";
  else
    return "Throw %2 %4";
  end
end
Verb { verb_throw_type, "~бросить|~кинуть", verb_with_inv_("вн"), "{}|в|на", aux_with_obj_("вн") }

--21. Move
Verb { "Move %2", "~передвинуть|~двигать|~сдвинуть|~пододвинуть", verb_with_obj_("вн") }

--22. Bant
Verb { "Bant %2 %3", "~перевязать|~бинтовать|~перебинтовать", verb_with_obj_inv_("вн"), aux_with_obj_inv_("тв") }

--23. Cure
Verb { "Cure %2 %3", "~прижечь", verb_with_obj_inv_("вн"), aux_with_obj_inv_("тв") }

--24. Wash
Verb { "Wash %2 %3", "~промыть|~мыть|~омыть", verb_with_obj_inv_("вн"), aux_with_obj_inv_("тв") }

--25. Heat
Verb { "Heat %2 %3", "~нагреть|~раскалить|~греть|~накалить", verb_with_inv_("вн"), aux_with_obj_inv_("тв") }

--26. Untie
Verb { "Untie %2", "~отвязать|~развязать", verb_with_obj_("вн") }

--27. Cut
Verb { "Cut %2 %3", "~разрубить|~перерубить|~рубить", verb_with_obj_("вн"), aux_with_obj_inv_("тв") }
parser.events.Cut = function(self, s)
  return "У меня нет никакого желания рубить топором " .. s:M("вн") .. ".";
end

--28. Get
Verb { "Get %2 %4", "~достать", verb_with_obj_("вн"), "из", aux_with_obj_("рд") }

--29. Swing
Verb { "Swing %2", "~помахать|~махать", verb_with_obj_("дт") }

--30. Turn
Verb { "TurnAround", "~обернуться|~оглянуться", "{}" }
parser.events.TurnAround = function()
  return "Я обернулся, но не увидел ничего необычного.";
end

--31. Lie
Verb { "Lie %3", "~лечь|~прилечь", "на", verb_with_obj_("вн") }

--32. KnifeCut
Verb { "KnifeCut %2 %3", "~перерезать|~разрезать|~резать", verb_with_obj_("вн"), aux_with_obj_inv_("тв") }
parser.events.KnifeCut = function(self, s)
  return "Не стоит резать " .. s:M("вн") .. " ножом для бумаг -- я лишь испорчу нож, да и какой в этом смысл?";
end

--33. Climb
function verb_ascend_type2(s)
  if s:word(2) == "в" then
    return "ClimbIn %3";
  else
    return "Climb %3";
  end
end
Verb { verb_ascend_type2, "~забраться|~залезть|~лезть", "на|в", verb_with_obj_("вн") }

--34. Wet
Verb { "Wet %2 %3", "~смочить|~намочить", verb_with_inv_("вн"), aux_with_inv_("тв") }

--35. Drink
Verb { "Drink %2", "~пить|~выпить", verb_with_obj_inv_("вн") }